import 'dart:convert';

import 'package:flutter/foundation.dart';
import 'package:get/get.dart';
import 'package:just_audio/just_audio.dart';
import 'package:netease_music/player/controller/bottom_player_overlay_controller.dart';
import 'package:netease_music/utils/real_api.dart';
import 'package:shared_preferences/shared_preferences.dart';

// （loop all）单曲循环（loop one）随机播放（shuffle）
enum PlayMode { loop, single, shuffle }

class AudioPlayerController extends GetxController {
  // 点击阀门防止重复发送多次
  bool flag = false;
  // 播放器实例
  final AudioPlayer _player = AudioPlayer();
  // 获取当前播放id
  int? get currentSongId => currentSong['id'];
  // 当前音乐信息
  Map<String, dynamic> currentSong = {};
  // 播放状态 播放中 暂停中
  bool isPlaying = false;
  // 播放模式
  PlayMode playMode = PlayMode.loop;
  // 播放进度（秒）
  var position = Duration.zero;
  // 总时长
  var duration = Duration.zero;
  // 当前播放列表
  List playlist = [];

  @override
  void onInit() {
    super.onInit();
    _initPlayer();
    // 播放状态监听
    _player.playerStateStream.listen((state) {
      isPlaying = state.playing;

      // 播放完成
      if (state.processingState == ProcessingState.completed) {
        onPlaybackComplete();
      }
      // 不使用obx 手动更新
      update();
    });

    // 播放进度监听
    _player.positionStream.listen((pos) {
      position = pos;
      // 不使用obx 手动更新
      update();
    });
    // 总时长
    _player.durationStream.listen((dur) {
      if (dur != null) {
        duration = dur;
        // 不使用obx 手动更新
        update();
      }
    });
  }

  void onPlaybackComplete() {
    // 播放完成回调，可自动播放下一首或重置状态
    isPlaying = false;
    // 不使用obx 手动更新
    update();
  }

  void _initPlayer() async {
    final prefs = await SharedPreferences.getInstance();

    // 读取播放模式
    final modeString = prefs.getString('playMode') ?? 'loop';
    playMode = PlayMode.values.firstWhere((e) => e.name == modeString);

    // 读取上次播放歌曲
    final songJson = prefs.getString('lastPlayedSong');
    if (songJson != null) {
      final songInfo = jsonDecode(songJson);
      currentSong = songInfo;
      // 不使用obx 手动更新
      update();
      // 预加载上次播放的 url
      final song = await RealApi.getSongUrl(songInfo['id']);
      if (song['data'][0]['url'] != null) {
        await _player.setUrl(song['data'][0]['url']);
        showMiniPlay();
      }
    }

    // 设置对应的播放器模式
    _applyPlayMode(playMode);
  }

  Future<void> playSong(Map<String, dynamic> info) async {
    if (currentSongId == info['id']) {
      // 防止重复点击
      togglePlayPause();
      return;
    }
    try {
      if (flag) {
        return;
      }
      flag = true;
      // 1. 获取播放 URL（假设接口是 song['id'] -> url）
      final song = await RealApi.getSongUrl(info['id']);
      if (song['data'][0]['url'] == null) {
        Get.snackbar(
          '暂无资源',
          '请见谅！',
          snackPosition: SnackPosition.TOP,
        );
        return;
      }
      await _player.setUrl(song['data'][0]['url']);
      _player.play();
      // 3. 更新 UI 状态
      currentSong = info;
      isPlaying = true;
      // 不使用obx 手动更新
      update();
      showMiniPlay();
      // 成功播放后 歌曲信息保存得到本地
      final prefs = await SharedPreferences.getInstance();
      prefs.setString('lastPlayedSong', jsonEncode(info));
      flag = false;
    } catch (e) {
      // Get.snackbar('播放失败', e.toString());
      flag = false;
    }
  }

  void showMiniPlay() {
    final overlayController = Get.find<BottomPlayerOverlayController>();
    overlayController.show(0); // 显示底部音乐播放栏
  }

  // 设置播放列表
  void setPlayList(list) {
    // 防止重复设置相同的列表
    if (!listEquals(playlist, list)) {
      playlist = list;
      // 不使用obx 手动更新
      update();
    }
  }

  // 切换播放暂停
  void togglePlayPause() {
    if (_player.playing) {
      _player.pause();
      isPlaying = false;
    } else {
      _player.play();
      isPlaying = true;
    }
    // 不使用obx 手动更新
    update();
  }

  // 切换播放模式 切换完 保存到本地
  void changePlayMode() async {
    switch (playMode) {
      case PlayMode.loop:
        playMode = PlayMode.single;
        _player.setLoopMode(LoopMode.one);
        break;
      case PlayMode.single:
        playMode = PlayMode.shuffle;
        _player.setShuffleModeEnabled(true);
        break;
      case PlayMode.shuffle:
        playMode = PlayMode.loop;
        _player.setShuffleModeEnabled(false);
        _player.setLoopMode(LoopMode.all);
        break;
    }

    _applyPlayMode(playMode);

    final prefs = await SharedPreferences.getInstance();
    prefs.setString('playMode', playMode.name);
  }

  void _applyPlayMode(PlayMode mode) {
    switch (mode) {
      case PlayMode.loop:
        _player.setLoopMode(LoopMode.all);
        _player.setShuffleModeEnabled(false);
        break;
      case PlayMode.single:
        _player.setLoopMode(LoopMode.one);
        _player.setShuffleModeEnabled(false);
        break;
      case PlayMode.shuffle:
        _player.setLoopMode(LoopMode.all);
        _player.setShuffleModeEnabled(true);
        break;
    }
  }

  // 修改进度条
  void seekTo(Duration position) {
    _player.seek(position);
  }

  // 上一首
  void playPrevious() {}
  // 下一首
  void playNext() {}

  @override
  void onClose() {
    _player.dispose();
    super.onClose();
  }
}
